﻿#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

//class A
//{
//public:
//	virtual void fun(int x = 1) { /*...*/ }
//};
//class B : public A
//{
//public:
//	virtual void fun(int y = 2) { /*...*/ } // 参数名字可以不同, 缺省值也可以不同, 这种情况下二者的参数列表仍然是相同的
//};

//class A
//{
//public:
//	virtual void fun(int x = 1) { /*...*/ }
//};
//class B : public A
//{
//public:
//	void fun(int y = 2) { /*...*/ } // 派生类的虚函数可以省略 virtual, 这样也可以构成重写, 但是这么写不规范
//};


//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};

//class C {};
//class D : public C {};
//
//class A
//{
//public:
//	virtual A& fun1() { /*...*/ }
//	virtual C& fun2() { /*...*/ }
//};
//
//class B : public A
//{
//public:
//	virtual B& fun1() { /*...*/ }
//	virtual D& fun2() { /*...*/ }
//};
//
//
//int main(int argc, char* argv[])
//{
//	//B* p = new B;
//	//p->test();
//
//	return 0;
//}

//class A
//{
//public:
//	/*virtual*/ ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	~B()
//	{
//		cout << "~B()->delete:" << _p << endl;
//		delete _p;
//	}
//protected:
//	int* _p = new int[10];
//};
//int main()
//{
//	A* p1 = new A;
//	A* p2 = new B;
//	// 只有派⽣类Student的析构函数重写了Person的析构函数，下⾯的delete对象调⽤析构函数，才能构成多态，才能保证p1和p2指向的对象正确的调⽤析构函数。
//
//	delete p1;
//	delete p2;
//	return 0;
//}

//class A
//{
//public:
//	virtual void fun()
//	{ /*...*/ }
//};
//
//class B : public A
//{
//public:
//	virtual void fun() override
//	{ /*...*/ }
//};

//class Animal
//{
//public:
//	virtual void fun() = 0;
//};
//
//class Cat : public Animal
//{
//public:
//	virtual void fun() {}
//	void feature() { cout << "可爱" << endl; }
//private:
//	/*...*/
//};
//
//class Dog : public Animal
//{
//public:
//	virtual void fun() {}
//	void feature() { cout << "忠诚" << endl; }
//private:
//	/*...*/
//};

//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//	cout << ((int*)&b)[0] << endl;
//	printf("%p", ((int**)&b)[0][0]);
//
//	return 0;
//}

static int i1 = 0;

class A
{
public:
	virtual void fun() {}
};

int main()
{
	A a;
	int i2 = 0;
	int* p1 = new int;
	int* p2 = &i2;
	int* p3 = &i1;
	cout << "堆区:\t\t" << p1 << endl;
	cout << "栈区:\t\t" << p2 << endl;
	cout << "静态区:\t\t" << p3 << endl;
	cout << "常量区:\t\t" << &"123456" << endl;
	cout << "虚表地址:\t" << (void*)((int**)&a)[0][0] << endl;

	return 0;
}